package com.lhsy.djcloud.common;

import cn.hutool.crypto.SecureUtil;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.security.NoSuchAlgorithmException;
import java.util.*;

/**
 *
 * 朱鹏的签名工具类
 * @author wangzw
 * @date 2021-01-12
 */
public class SignUtil {
    private final static String appId = "c0f23a46f0c84fa2a864a787448729e3";
    private final static String appKey = "WjNrAfH4tiRE9fQ2Jbxz";

    public static void main(String[] args) throws NoSuchAlgorithmException, JSONException {
        String s = jsonObjConverSortStr("{\"k1\":\"v1\",\"k2\":[\"v2_1\",\"v2_2\"],\"k3\":{\"k31\":\"v31\",\"k32\":\"v32\"}}");
        String sign = SecureUtil.md5(s + SecureUtil.md5(appId + appKey));
        System.out.println(sign);
    }
    public static String jsonObjConverSortStr(String jsonText) throws JSONException {
        System.out.println("### jsonText >> " + jsonText);
        StringBuffer returnBuStr = new StringBuffer();
        jsonObjParseRecur(returnBuStr, jsonText, true);
        return returnBuStr.toString();
    }

    private static void jsonObjParseRecur(StringBuffer returnBuStr, String jsonText, boolean isComplexObj) throws JSONException {
        JSONObject jsonObj = new JSONObject(jsonText);
        Iterator<String> keys = jsonObj.keys();

        // 局部key集合 并排序
        Set<String> keySetSort = new HashSet<>();
        while (keys.hasNext()) {
            String key = keys.next();
            keySetSort.add(key);
        }
        List<String> sortList = new ArrayList<>(keySetSort);
        Collections.sort(sortList);

        // 开始遍历 递归解析
        for (String key : sortList) {
//                System.out.println("### " + key + " >> " + jsonObj.get(key).toString());
            if (returnBuStr.length() == 0 || isComplexObj) {
                returnBuStr.append(key).append("=");
                isComplexObj = false;
            } else {
                returnBuStr.append("&").append(key).append("=");
            }

            StringBuffer sbSubArr = new StringBuffer();
            if (jsonObj.optJSONArray(key) instanceof JSONArray) { // 类型 - JSONArray
                JSONArray jsonArray = jsonObj.getJSONArray(key);
//                returnBuStr.append("[");

                for (int i = 0; i < jsonArray.length(); i++) {
                    Object obj = jsonArray.get(i);

                    // JSONArray - 依然是数组元素
                    if (obj instanceof JSONArray) {
                        String jsonArrayObjString = obj.toString();
                        if (sbSubArr.length() == 0) {
                            sbSubArr.append(jsonArrayObjString);
                        } else {
                            sbSubArr.append("&").append(jsonArrayObjString);
                        }
                        continue;
                    }

                    // JSONArray - jsonObj复杂对象
                    if (obj instanceof JSONObject) {
                        JSONObject jsonObjTemp = jsonArray.getJSONObject(i);
                        if (i == 0) {
                            sbSubArr.append("{");
                            jsonObjParseRecur(sbSubArr, jsonObjTemp.toString(), true);
                            sbSubArr.append("}");
                        } else {
                            sbSubArr.append(",{");
                            jsonObjParseRecur(sbSubArr, jsonObjTemp.toString(), true);
                            sbSubArr.append("}");
                        }
                    }

                    // JSONArray - 普通元素
                    if (!(obj instanceof JSONArray) && !(obj instanceof JSONObject)) {
//                            System.out.println("### 既不是JSONObj又不是JSONArray, 须收集各个元素 ####");
                        if (sbSubArr.length() == 0) {
                            sbSubArr.append(obj.toString());
                        } else {
                            sbSubArr.append("&").append(obj.toString());
                        }
                    }
                }
                returnBuStr.append(sbSubArr);
//                returnBuStr.append("]");
            } else if (jsonObj.optJSONObject(key) instanceof JSONObject) { // 类型 - JSONObject
//                returnBuStr.append("{");
                jsonObjParseRecur(returnBuStr, jsonObj.optJSONObject(key).toString(), true);
//                returnBuStr.append("}");

            } else { // 以上两种情况都不是的情况下，则为普通元素
//                    System.out.println("### key >> " + key + ", value >> " + jsonObj.get(key).toString() + ", 既不是JSONObj又不是JSONArray ####");
                returnBuStr.append(jsonObj.get(key).toString());
            }
        }
//        System.out.println("### jsonStrBu >> " + returnBuStr.toString());
    }
}